package com.atguigu.mapreduce.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

import java.io.IOException;

/*
 * 1. 创建自定义的Mapper需要继承hadoop提供的Mapper父类
 * 2. 定义Mapper中具体输入输出的key和value的数据类型
 *    -- 输入：
 *       -- key : 表示的是一行数据的偏移量 LongWritable
 *       -- value: 当前一行数据  Text
 *    -- 输出
 *       -- key: 当前一个单词   Text
 *       -- value: 给每个单词进行标记 1   IntWritable
 *
 * 3. 重写map() 方法，在次方法中实现数据的处理逻辑
 *
 * */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private Text outk = new Text();
    private IntWritable outv = new IntWritable(1);

    @Override
    protected void setup(Context context) throws IOException, InterruptedException {
        // 获取当前切片对应的文件名字
        FileSplit fileSplit = (FileSplit) context.getInputSplit();
        System.out.println(fileSplit.getPath().getName());
    }

    /**
     * map端的核心业务处理方法（针对当前一行数据按照分隔符进行切割，然后再讲每一个切割的单词打标记 输出）
     *
     * @param key
     * @param value
     * @param context 上下文对象  在整个数据处理流程中一直跟随，以便在当前流程中获取之前内容以及往下继续的作用
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 1. 获取当前一行数据 并转换成String
        String lineData = value.toString();
        // 2. 切割
        String[] datas = lineData.split(" ");
        // 3. 遍历datas，给每一个元素（单词打标记1 输出即可）
        for (String data : datas) {
            outk.set(data);
            context.write(outk, outv);
        }

    }
}
